package com.fjwt.gz.service.mapper;

import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fjwt.gz.db.dto.FansActivityDTO;
import com.fjwt.gz.db.dto.FansAuthDTO;
import com.fjwt.gz.db.dto.FansAwardDTO;
import com.fjwt.gz.db.entity.FansAwardEntity;
import com.fjwt.gz.db.entity.StatActe017RecordEntity;
import com.fjwt.gz.db.vo.*;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 会员奖品表 Mapper 接口
 * </p>
 *
 * @author shiyonghao
 * @since 2025-04-09
 */
public interface FansAwardMapper extends BaseMapper<FansAwardEntity> {

    /**
     * 查询5分钟内是否兑换过卡券
     *
     * @param
     * @return
     */
    List<FansAwardDTO> selectRecord(@Param("date") String date, @Param("fansId") Long fansId, @Param("scoreExchangeId") String scoreExchangeId, @Param("infoType") Integer infoType);

    IPage<FansCouponsVo> selectListBycouponState(IPage<?> page, @Param("fansId") Long fansId, @Param("couponState") Long couponState, @Param("awardType") Long awardType, @Param("appId") String appId);

    IPage<FansCouponsVo> selectListByGoodsState(IPage<?> page, @Param("fansId") Long fansId, @Param("couponState") Long couponState, @Param("awardType") Long awardType, @Param("appId") String appId);

    IPage<FansCouponsVo> selectListByCDKState(IPage<?> page, @Param("fansId") Long fansId, @Param("couponState") Long couponState, @Param("awardType") Long awardType, @Param("virtualType") Long virtualType, @Param("appId") String appId);

    IPage<FansCouponsVo> selectListByvirtualState(IPage<?> page, @Param("fansId") Long fansId, @Param("couponState") Long couponState, @Param("awardType") Long awardType, @Param("virtualType") Long virtualType, @Param("state") Long virtualState, @Param("appId") String appId);

    /**
     * 查询用户活动卡券奖品列表
     *
     * @param fansActivityDTO
     * @return
     */
    List<FansCouponsVo> selectFansActivateCoupons(@Param("fansActivityDTO") FansActivityDTO fansActivityDTO);

    /**
     * 扫码派券数据
     *
     * @param awardIds
     * @return
     */
    List<ExportAwardVO> exportACTE006CouponAward(List<Long> awardIds);

    /**
     * 查询活动已激活/已使用卡券用户列表
     *
     * @param fansActivityDTO
     * @return
     */
    List<FansAwardDTO> selectActivityUnusedCoupon(@Param("fansActivityDTO") FansActivityDTO fansActivityDTO);

    /**
     * Abc查询用户某个活动卡券领取情况
     *
     * @param fansAwardDTO
     * @return
     */
    List<FansAwardEntity> getFansAwardsByCondition(@Param("fansAwardDTO") FansAwardDTO fansAwardDTO);


    Map<String, String> syncFansCouponNum(@Param("fansId") Long fansId);

    IPage<FansCouponsVo> syncFansCouponList(IPage page, @Param("fansId") Long fansId, @Param("json") JSONObject json);

    // ACTE008卡券导出EXCEL
    List<ExportAwardVO> exportACTE008CouponAward(@Param("awardIds") List<Long> awardIds);

    // ACTE008实物信息
    List<ExportAwardVO> exportACTE008GoodsAward(@Param("awardIds") List<Long> awardIds);

    // 卡券奖品信息
    List<ExportAwardVO> exportCouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);

    // 实物奖品信息
    List<ExportAwardVO> exportGoodsAward(@Param("awardIds") List<Long> awardIds);

    /**
     * 扫码领券数据
     *
     * @param awardIds 奖品ids
     * @return
     */
    List<ExportAwardVO> exportACTE004CouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);

    /**
     * 013 导出EXCEL  待修改
     *
     * @param awardIds 奖品ids
     * @param agentNo 机构号
     * @return 导出报表结果信息
     */
    List<ExportAwardVO> exportAct013CouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);


    /**
     * 015 016 导出EXCEL  待修改
     *
     * @param awardIds 奖品ids
     * @param agentNo 机构号
     * @return 导出报表结果信息
     */
    List<ExportAwardVO> exportWxDiscountsCouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);

    /**
     * 024邀请助力导出EXCEL
     *
     * @param awardIds
     * @return
     */
    List<ExportAwardVO> exportACTE024CouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);

    /**
     * 025会员福利导出EXCEL
     *
     * @param awardIds
     * @return
     */
    List<ExportAwardVO> exportACTE025CouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);


    /**
     * 026导出EXCEL
     *
     * @param awardIds
     * @return
     */
    List<ExportAwardVO> exportACTE026CouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);

    /**
     * 027导出EXCEL
     *
     * @param awardIds
     * @return
     */
    List<ExportAwardVO> exportACTE027CouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);

    /**
     * 028导出EXCEL
     *
     * @param awardIds
     * @return
     */
    List<ExportAwardVO> exportACTE028CouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);

    /**
     * 029导出EXCEL
     *
     * @param awardIds
     * @return
     */
    List<ExportAwardVO> exportACTE029CouponAward(@Param("awardIds") List<Long> awardIds, @Param("agentNo") String agentNo);

    /**
     * 用户实名导出EXCEL
     *
     * @param fansAuthDTO
     * @return
     */
    List<ExportAwardVO> exportReal(@Param("fansAuthDTO") FansAuthDTO fansAuthDTO);

    /**
     * 获取发起转介的用户奖品信息
     *
     * @param page
     * @param offsetDate
     * @return
     */
    IPage<FansAwardVO> findB1ActivateAward(Page page, @Param("offsetDate") Date offsetDate, @Param("awardType") Integer awardType, @Param("templateNo") String templateNo);

    /**
     * 通过 remark = 'B1' and `state` = 3 用户Id create desc 查询最近的数据
     *
     * @param fansId
     * @return
     */
    FansAwardVO selectB1CouponAward(@Param("fansId") Long fansId);

    /**
     * 通过 remark = 'B1' and `state` = 3 用户Id 用户奖品ID 查询数据
     *
     * @param fansId
     * @param fansAwardId
     * @return
     */
    List<FansAwardEntity> selectB1CouponAwards(@Param("fansId") Long fansId, @Param("fansAwardId") Long fansAwardId);

    /**
     * 活动奖品列表
     *
     * @param fansId
     * @param awardId
     * @param awardType
     * @param remark
     * @return
     */
    List<FansAwardEntity> selectListFansAward(@Param("fansId") Long fansId, @Param("awardId") Long awardId, @Param("awardType") Integer awardType, @Param("remark") String remark, @Param("flag") String flag);


    /**
     * 获取发放卡券列表
     *
     * @param iPage
     * @param activityId
     * @return
     */
    IPage<AwardCouponVO> sendCouponList(IPage iPage, @Param("activityId") Long activityId, @Param("phone") String phone, @Param("nickName") String nickName,
                                        @Param("realName") String realName, @Param("createdAt") String createdAt, @Param("agentNo") String agentNo,
                                        @Param("level") Integer level);

    /**
     * 卡券领用详情
     *
     * @param fansAwardId
     * @return
     */
    AwardCouponVO fansCouponDetail(@Param("fansAwardId") Long fansAwardId, @Param("locationAgentNo") String locationAgentNo);

    /**
     * @param userId
     * @return
     */
    List<FansAwardEntity> fansActiveCouponBefore(Long userId);

    /**
     * ACTE017 导出卡券奖品
     * @param awardType
     * @param awardId
     * @return
     */
    List<Acte017ExportVO> exportACTE017CouponAward(@Param("awardType") String awardType, @Param("awardId") String awardId);

    /**
     * ACTE017 导出实物奖品
     * @param awardType
     * @param awardId
     * @return
     */
    List<Acte017ExportVO> exportACTE017GoodsAward(@Param("awardType") String awardType, @Param("awardId") String awardId);

    /**
     * ACTE017 导出积分奖品
     * @param activityId
     * @return
     */
    List<Acte017ExportVO> exportACTE017ScoreAward(@Param("activityId") String activityId);

    /**
     * 获取 ACTE017越减越便宜活动--用户参与记录明细
     * @param page
     * @return
     */
    IPage<StatActe017RecordEntity> getStatActe017Record(Page page);

    /**
     * 获取ACTE017 根据appid 和机构ID 的数量
     *
     * @param liteAppIdList
     * @param activityIdList
     * @param agentNoList
     * @return
     */
    List<Map<String, Object>> getActivateCount(@Param("liteAppIdList") List<String> liteAppIdList, @Param("activityIdList") List<Long> activityIdList, @Param("agentNoList") List<String> agentNoList);
}
